import time

import Page
import json
import allure
import requests
from time import sleep
from Base.base import Base
from Base.get_driver import get_driver
from Base.base_data import Setting as a

"""PageLogin类，作为登录页,继承Base类"""


class PageLogin(Base):

# ---------------------------------------[单个操作]依赖/组合业务/断言使用-----------------------------------------------

    # 输入邮箱
    def page_enter_email(self, username):
        allure.attach("邮箱", "输入邮箱：{}".format(username))
        self.send_element(Page.login_email_id, username)
        sleep(1)

    # 输入密码
    def page_enter_password(self, password):
        allure.attach("密码", "输入密码：{}".format(password))
        self.send_element(Page.login_password_id, password)
        sleep(1)

    # 点击登录按钮
    def page_click_login_btn(self):
        sleep(1)
        self.click_element(Page.login_btn_id)

    # 点击忘记密码按钮
    def page_click_forget_btn(self):
        self.click_element(Page.login_forget_btn)

    # 忘记密码弹框--输入邮箱
    def page_forget_enter_email(self, email):
        allure.attach("邮箱", "{}".format(email))
        self.send_element(Page.login_forget_email_input, email)

    @allure.step(title="忘记密码 -->点击确定")
    def click_submit_forget(self):
        sleep(2)
        self.click_element(Page.login_forget_submit_btn)
        sleep(2)

    # 忘记密码弹框--点击返回登录页面
    def page_forget_back_login(self):
        sleep(2)
        self.click_element(Page.login_forget_back_login)

    # 忘记密码弹框--获取输入框提示文本
    def page_get_input_reminder(self):
        try:
            # 获取输入框提示文本
            return self.get_text(Page.login_input_reminder)
        except:
            return ""

    # 邮件提示页面--获取邮箱元素文本值
    def page_get_email_reminder(self):
        sleep(2)
        return self.get_text(Page.login_email_reminder)

    # 判断是否登录成功
    def page_if_login_success(self):
        # 注意 一定要将找元素的结果返回，True：存在
        return self.base_element_is_exist(Page.login_btn_id)

    @allure.step(title="登录163邮箱")
    def login_163_email_ok(self):
        self.click_element(Page.login_type_but)
        sleep(2)
        self.base_switch_frame(Page.login_frame)
        sleep(2)
        self.send_element(Page.login_163_email, "paas_console")
        sleep(2)
        self.send_element(Page.login_163_pwd, "admin123")
        sleep(2)
        self.click_element(Page.login_163_but)
        sleep(5)

    @allure.step(title="打开重置密码页面")
    def open_reset_page(self):
        self.text_click_element("收件箱")
        sleep(2)
        self.text_click_element("busipaas-admin")
        sleep(2)
        self.base_switch_default_frame()
        sleep(2)
        self.base_switch_frame(Page.login_reset_frame)
        sleep(2)
        self.click_element(Page.login_reset_url)
        sleep(2)
        self.base_switch_default_frame()
        sleep(2)
        self.text_click_element("继续前往")
        sleep(2)
        self.base_switch_window("控制台")
        sleep(5)

    @allure.step(title="重置密码 -->输入密码")
    def input_password_reset(self, password):
        sleep(1)
        self.send_element(Page.login_new_password_input, password)

    @allure.step(title="重置密码 -->输入确认密码")
    def input_confirm_password_reset(self, password):
        sleep(1)
        self.send_element(Page.login_confirm_password_input, password)

    @allure.step(title="点击 语言")
    def click_language_btn(self):
        self.click_element(Page.login_lan_btn)
        sleep(1)

    @allure.step(title="点击 英文选项")
    def click_english_option(self):
        sleep(2)
        self.click_element(Page.login_option_first)
        sleep(3)

    @allure.step(title="点击 中文选项")
    def click_chinese_option(self):
        sleep(2)
        self.click_element(Page.login_option_second)

    @allure.step(title="获取登录标题文本值")
    def get_login_text(self):
        return self.get_text(Page.login_page_login_text)

    @allure.step(title="获取语言按钮文本值")
    def get_language_text(self):
        return self.get_text(Page.login_lan_btn_text)

    @allure.step(title="获取控制台文本值")
    def get_console_text(self):
        return self.get_text(Page.login_console_btn_text)

#---------------------------------------------------[组合业务]test脚本使用----------------------------------------------

    # # 组合业务方法  -->忘记密码业务直接调用
    # @allure.step(title="发送更换密码邮箱操作")
    # def forget_password(self, username):
    #     # 调用 输入邮箱
    #     self.page_forget_enter_email(username)
    #     # 调用 点击确定
    #     self.click_submit_forget()
    #
    # # 组合业务方法  -->切换语言业务直接调用
    # @allure.step(title="登录页面--选择英文操作")
    # def sel_english(self):
    #     # 调用 点击语言按钮
    #     self.page_click_language_btn()
    #     # 调用 点击英文选项
    #     self.page_click_language_first_option()
    #
    # # 组合业务方法  -->切换语言业务直接调用
    # @allure.step(title="登录页面--选择中文操作")
    # def sel_chinese(self):
    #     # 调用 点击语言按钮
    #     self.page_click_language_btn()
    #     # 调用 点击中文选项
    #     self.page_click_language_second_option()

    # 组合业务方法 -->接口注册登录test前置
    @allure.step(title="接口注册用户")
    def api_login(self, email,passwd):
        try:
            dic = {"email": email, "name": "login_test", "passwd": passwd}
            data = json.dumps(dic)
            data = bytes(data, 'utf-8')  # 格式化请求体
            url = "http://" + a.api_test + "/api/v1/accounts/register"  # 请求url
            self.res = requests.post(url=url, headers={'Content-Type': 'application/json'}, data=data)  # 发送请求
            allure.attach('描述', '响应状态码:{}'.format(self.res.status_code))
            allure.attach('描述', '响应信息:{}'.format(self.res.text))
            print(self.res.text)
            # 调用 断言 -->actual结果 == expect结果
            if self.base_if_include("Account is exist",self.res.text) or \
                    self.base_if_include("success",self.res.text):
                return True
            else:
                return False
        except Exception as e:
            allure.attach('错误描述', 'POST请求出错，出错原因:%s' % e)
            return False

#----------------------------------------------------[断言]test脚本使用-------------------------------------------------

    # 断言 -->页面邮箱元素 == 输入邮箱
    def page_if_page_email_equal(self,email):
        # 调用 断言 -->actual结果 == expect结果
        return self.base_if_equal(self.page_get_email_reminder(),email)

    # 断言 -->输入框提示语文本 == 预期
    @allure.step(title="断言输入框提示语文本 == 预期")
    def if_input_explain(self, expect_result):
        try:
            # 调用 定位输入框提示语元素
            explain_ele = self.search_elements(Page.app_input_explain)
            # 判断文本与预期一致
            num = 0
            for i in range(0, len(explain_ele)):
                if explain_ele[i].text == expect_result:
                    num += 1
            # 刷新
            self.refresh_current_page()
            # 调用 断言 -->actual结果 == expect结果
            if num > 0:
                allure.attach("断言描述", "断言成功，输入框提示语文本 == 预期")
                return True
            else:
                allure.attach("断言描述", "断言失败，输入框提示语文本 != 预期")
                return False
        except Exception as e:
            allure.attach("失败描述", "断言输入框提示语文本 == 预期,失败原因为：{}".format(e))
            # 刷新
            self.refresh_current_page()
            return False

    @allure.step(title="接口注册用户")
    def api_sign(self):
        try:
            email = "paas{}@auto.com".format(time.strftime("%Y%m%d%H%M%S"))
            passwd = "admin123"
            dic = {"email": email, "name": "login_test", "passwd": passwd}
            data = json.dumps(dic)
            data = bytes(data, 'utf-8')  # 格式化请求体
            url = "http://" + a.api_test + "/api/v1/accounts/register"  # 请求url
            res = requests.post(url=url, headers={'Content-Type': 'application/json'}, data=data)  # 发送请求
            allure.attach('描述', '响应状态码:{}'.format(res.status_code))
            allure.attach('描述', '响应信息:{}'.format(res.text))
            print(res.text)
            if "Account is exist" in res.text or "success" in res.text:
                return email
            else:
                return "paas_console@163.com"
        except Exception as e:
            allure.attach('错误描述', 'POST请求出错，出错原因:%s' % e)
            return False

    @allure.step(title="注册后登录")
    def login(self):
        self.login_con(self.api_sign(), "admin123")

    # 组合业务方法  -->登录业务直接调用
    @allure.step(title="登录操作")
    def login_con(self, username, password):
        try:
            # 调用 输入邮箱
            self.page_enter_email(username)
            # 调用 输入密码
            self.page_enter_password(password)
            # 调用 点击登录按钮
            self.page_click_login_btn()
        except Exception as e:
            allure.attach("失败描述", "登录失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->发送更改密码邮件业务直接调用
    @allure.step(title="发送更改密码邮件操作")
    def post_email(self, email):
        try:
            # 调用 点击忘记密码
            self.page_click_forget_btn()
            # 调用 忘记密码弹框--输入邮箱
            self.page_forget_enter_email(email)
            # 调用 忘记密码弹框--点击确定按钮
            self.click_submit_forget()
        except Exception as e:
            allure.attach("失败描述", "发送邮件失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 返回登录页
            self.page_forget_back_login()
            assert False

    # 调用 登录操作  [给其他所有脚本使用]
    def login_success(self, ):
        self.login_con(a.user, a.pwd)
        sleep(1)


if __name__ == '__main__':
    p = PageLogin(get_driver())
    # 测试 登录
    # p.login_con("417283895@QQ.com", "admin123")
    # p.login_success()
    # 测试 注册
    # p.api_login("test123@console.com","admin123")
    # 测试 发邮件
    # p.enter_email("417283895@Q23Q.com")
    p.login_con(p.api_sign(), "admin123")